package com.woniu.util;


import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;

import java.text.ParseException;
import java.util.Map;

/**
 * jwt工具类
 *
 * @description:
 */
public class JwtUtil {
    //操作redis的类: 进行数据的增删改查
    //@Autowired
    //private StringRedisTemplate redisTemplate;
    private static String secretKey = "1a2b3c4d格兰花格欧肯特轩";//密钥

    /**
     * @return java.lang.String
     * @description 封装加密方法
     * @params [map]
     * @date 2024/08/13 上午 10:20
     */

    public static String createJwt(Map map) throws JOSEException {
        //  1.头部
        JWSHeader header = new JWSHeader
                .Builder(JWSAlgorithm.HS256)                // 指定加密算法
                .type(JOSEObjectType.JWT).build();          // 指定常量

        //  2.载荷(用户信息)
        Payload payload = new Payload(map);                 // map用户信息应该是传进来的

        //3.签名 =加密HS256(头部+载荷+密钥)
        JWSObject jwsObject = new JWSObject(header, payload);

        JWSSigner signer = new MACSigner(secretKey);

        jwsObject.sign(signer);//用户密钥加密

        //4.生成最终jwt,jwsObject对象序列化后得到jwt字符
        return jwsObject.serialize();
    }

    // 解密方法
    public static boolean deCode(String jwt) throws  JOSEException, ParseException {
        // 通过JWT字符串反序列化得到JWSObject对象
        JWSObject jwtObj = JWSObject.parse(jwt);
        JWSVerifier jwsVerifier = new MACVerifier(secretKey);       // 解密类
        return jwtObj.verify(jwsVerifier);  // 解密
    }

    //获取载荷中用户信息
    public static Map getJwtUser(String jwt) throws ParseException {
        JWSObject jwtObj = JWSObject.parse(jwt);
        Payload payload = jwtObj.getPayload();      // 得到载荷
        return payload.toJSONObject();              //得到载荷中用户信息
    }
}